/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.fina.manager;

import com.brain.core.dto.FechaFiltroDto;
import com.brain.core.dto.OrganizacionDto;
import com.brain.core.manager.*;
import com.brain.core.exception.DAOException;
import com.brain.core.hibernate.dao.DAOGenerico;
import com.brain.fina.dto.LetraDto;
import com.brain.fina.view.util.ConstantesFina;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;

/**
 * @author Greip Company
 * @since 09/01/2014
 * @version 1.0
 */
@Service
public class LetraManager extends ComunManager<LetraDto> implements Serializable {

    /**
     * Identificador de la entidad Finanzas
     *
     * @since 09/01/2014
     */
    private Long idEntidad = 276L;
    /**
     * Objeto que permite el acceso a la capa de datos
     *
     * @since 09/01/2014
     */
    @Resource
    private DAOGenerico<LetraDto> springHibernateDao;

    /**
     * Metodo que obtiene todos los datos de la entidad
     *
     * @since 09/01/2014
     * @return retorna una lista con todos los datos de la entidad
     */
    public List<LetraDto> obtenerTodos() throws DAOException {
        return springHibernateDao.listarTodosDtos(LetraDto.class);
    }

    /**
     * Metodo que obtiene todos los datos coincidentes con el filtro
     *
     * @since 09/01/2014
     * @param filtros es el objeto de la Interfaz Map , que envía un map con 2
     * parámetros
     * @return retorna una lista con todos los datos de la entidad coincidentes
     * con el filtro
     */
    public List<LetraDto> obtenerConFiltro(Map<String, Object> filtros) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltros(LetraDto.class, filtros);
    }

    /**
     * Metodo que obtiene todos los datos coincidentes con el filtro , además
     * permite manejar el orden de los datos
     *
     * @since 09/01/2014
     * @param filtros es el objeto de la Interfaz Map , que envía un mapa con 2
     * parámetros
     * @param orden es el objeto de la Interfaz Map , que envía un mapa con 2
     * parámetros
     * @return retorna una lista con todos los datos de la entidad coincidentes
     * con el filtro ordenado manualmente
     */
    public List<LetraDto> obtenerConFiltroConOrden(Map<String, Object> filtros, Map<String, String> orden) throws DAOException {
        return springHibernateDao.obtenerDtosConFiltrosConOrden(LetraDto.class, filtros, orden);
    }

    /**
     * Metodo que devuelve un Dto
     *
     * @since 09/01/2014
     * @param id identificador o codigo en la tabla a obtener
     * @return retorna un Dto lleno de datos en caso que encuentre coincidencias
     * con el parámetro enviado
     */
    public LetraDto obtenerPorId(Long id) throws DAOException {
        return springHibernateDao.obtenerDtoPorId(LetraDto.class, id);
    }

    /**
     * Metodo que permite obtener una lista de valores de la Clase LetraDto
     *
     * @since 09/01/2014
     * @return retorna una lista de valores de la Clase LetraDto
     */
    public List<LetraDto> obtenerLetras() throws DAOException {
        String query = "select e from LetraDto as e ";
        query += " order by e.id desc";
        return springHibernateDao.ejecutarQuery(query);
    }

    /**
     * Metodo que permite eliminar un objeto de tipo lista de la clase LetraDto
     *
     * @since 09/01/2014
     */
    public void eliminarLista(List<LetraDto> listaEliminar) throws DAOException {
        springHibernateDao.borrarColeccion(listaEliminar);
    }

    /**
     * Metodo que permite obtener una lista de Letras por cobrar
     *
     * @param organizacionDto organización actual donde se hace la transacción
     * @param filtroDto objeto de la clase LetraDto que contiene los valores
     * para filtrar en la consulta
     * @param fechaFiltroDto objeto de la clase FechaFiltroDto , filtra fechas
     * de las letras
     * @since 09/01/2014
     * @return retorna una lista de valores coincidentes de la Clase LetraDto
     */
    public List<LetraDto> obtenerLetraXCobrar(OrganizacionDto organizacionDto, LetraDto filtroDto, FechaFiltroDto fechaFiltroDto) throws DAOException {
        String query = "select dto from LetraDto as dto where dto.financiamientoLetraDto.documentoVentaDto.organizacionDto.id = ?  ";
        List<Object> listaParametros = new ArrayList<Object>();
        listaParametros.add(organizacionDto.getId());

        if (filtroDto.getId() != null && !filtroDto.getId().equals(0L)) {
            query += " and dto.id = ?";
            listaParametros.add(filtroDto.getId());
        } else {
            if (filtroDto.getEstado() != null && !filtroDto.getEstado().equals(ConstantesFina.ValoresConstantes.NOTA_CREDITO_COD_ESTADO_TODOS)) {
                query += " and dto.estado = ?";
                listaParametros.add(filtroDto.getEstado());
            }

            if (fechaFiltroDto.getFechaInicio() != null && fechaFiltroDto.getFechaFin() != null) {
                query += " and dto.fechaVencimiento between ? and ?";

                Calendar c = Calendar.getInstance();
                c.setTime(fechaFiltroDto.getFechaInicio());
                c.set(Calendar.HOUR, 0);
                c.set(Calendar.MINUTE, 0);
                c.set(Calendar.SECOND, 0);
                listaParametros.add(c.getTime());
                c.setTime(fechaFiltroDto.getFechaFin());
                c.set(Calendar.HOUR, 23);
                c.set(Calendar.MINUTE, 59);
                c.set(Calendar.SECOND, 59);
                listaParametros.add(c.getTime());
            }
        }
        query += " order by dto.fechaVencimiento desc";

        return springHibernateDao.ejecutarQuery(query, listaParametros);
    }

    public Long getIdEntidad() {
        return idEntidad;
    }

    public void setIdEntidad(Long idEntidad) {
        this.idEntidad = idEntidad;
    }
}
